package main

import (
	"fmt"
	"unsafe"
)

//空结构体
func main() {
	a := A{}
	b := B{}
	fmt.Printf("%p\n", &a)
	fmt.Printf("%p\n", &b) //地址都是 0x58acd8 ，这个随着golang的版本，会更改

	fmt.Println(unsafe.Sizeof(a)) //空结构体的大小是0，因此可以用来节省内存

	//1.10W大小的int32数组
	nums := [100000]int32{}
	fmt.Println(unsafe.Sizeof(nums)) //大小是400000字节

	//2.空结构体的数组
	datas := [100000]struct{}{}
	fmt.Println(unsafe.Sizeof(datas)) //大小是0字节

	//3.空结构体的map
	dataMap := make(map[string]struct{}, 100)
	dataMap["1"] = A{}
	fmt.Println(unsafe.Sizeof(dataMap["1"])) //每个元素占用0字节
	//int64为value的map，一个元素占用8字节
	dataMap2 := make(map[string]int64, 100)
	dataMap2["1"] = 100
	fmt.Println(unsafe.Sizeof(dataMap2["1"])) //占用8

	//因此有时候我们只需要使用map的key，那么为了节省内存，可以用空结构体，同理对于channel也一样
	for _, v := range []string{"k1", "k2"} {
		dataMap[v] = struct{}{}
	}

	for k, _ := range dataMap {
		fmt.Println(k)
	}

}

type A struct{}

type B struct{}
